package module.bank;

import common.model.Entity.bankEntity.Account;
import common.model.Entity.bankEntity.Transaction;
import network.protocol.Response;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 银行账户服务接口
 * 提供账户管理和交易操作的相关服务
 */
public interface BankAccountService {

    /**
     * 根据用户ID获取账户列表
     * @param userId 用户ID
     * @return 包含账户列表的响应
     */
    Response<List<Account>> getAccountsByUserId(Long userId);

    /**
     * 根据账户ID获取账户信息
     * @param accountId 账户ID
     * @return 包含账户信息的响应
     */
    Response<Optional<Account>> getAccountById(Long accountId);

    /**
     * 账户充值
     * @param accountId 账户ID
     * @param amount 充值金额
     * @return 包含操作结果的响应
     */
    Response<Boolean> recharge(Long accountId, BigDecimal amount);

    /**
     * 账户取款
     * @param accountId 账户ID
     * @param amount 取款金额
     * @return 包含操作结果的响应
     */
    Response<Boolean> withdraw(Long accountId, BigDecimal amount);

    /**
     * 转账操作
     * @param fromAccountId 转出账户ID
     * @param toAccountId 转入账户ID
     * @param amount 转账金额
     * @param description 转账描述
     * @return 包含操作结果的响应
     */
    Response<Boolean> transfer(Long fromAccountId, Long toAccountId, BigDecimal amount, String description);

    /**
     * 获取账户交易记录
     * @param accountId 账户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 包含交易记录列表的响应
     */
    Response<List<Transaction>> getTransactionHistory(Long accountId, LocalDateTime startDate, LocalDateTime endDate, Integer transactionType);


    /**
     * 创建新账户
     * @param userId 用户ID
     * @return 包含新账户信息的响应
     */
    Response<Account> createAccount(Long userId, String accountName);

    /**
     * 关闭账户
     * @param accountId 账户ID
     * @return 包含操作结果的响应
     */
    Response<Account> updateAccountName(Long accountId, String newName);

    Response<Boolean> deleteAccount(Long accountId);

}
